package com.song.service.impl.gxtp;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.song.entity.gxtp.GxtpRygx;
import com.song.mapper.gxtp.GxtpRygxMapper;
import com.song.service.gxtp.GxtpRygxService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

/**
 * <p>
 * 关系图谱_人员关系 服务实现类
 * </p>
 *
 * @author song
 * @since 2025-01-21
 */
@Service
public class GxtpRygxServiceImpl extends ServiceImpl<GxtpRygxMapper, GxtpRygx> implements GxtpRygxService {

    @Override
    public boolean checkExists(GxtpRygx gxtpRygx) {
        LambdaQueryWrapper<GxtpRygx> lambda = new QueryWrapper<GxtpRygx>().lambda();
        lambda.eq(GxtpRygx::getGmsfhmMaster, gxtpRygx.getGmsfhmMaster());
        lambda.eq(GxtpRygx::getGmsfhmSlave, gxtpRygx.getGmsfhmSlave());
        GxtpRygx dbData = getOne(lambda);
        return dbData != null;
    }

    @Override
    public void updateByDoubleId(GxtpRygx gxtpRygx) {
        UpdateWrapper<GxtpRygx> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq(gxtpRygx.getGmsfhmMaster(), gxtpRygx.getGmsfhmMaster());
        updateWrapper.eq(gxtpRygx.getGmsfhmSlave(), gxtpRygx.getGmsfhmSlave());
        updateWrapper.set("rygx", gxtpRygx.getRygx());
        update(updateWrapper);
    }

    @Override
    public void removeByDoubleId(String gmsfhmMaster, String gmsfhmSlave) {
        LambdaQueryWrapper<GxtpRygx> lambda = new QueryWrapper<GxtpRygx>().lambda();
        lambda.eq(GxtpRygx::getGmsfhmMaster, gmsfhmMaster);
        lambda.eq(GxtpRygx::getGmsfhmSlave, gmsfhmSlave);
        remove(lambda);
    }

    @Override
    public List<GxtpRygx> queryRygxList(String gmsfhm) {
        LambdaQueryWrapper<GxtpRygx> lambda = new QueryWrapper<GxtpRygx>().lambda();
        lambda.eq(GxtpRygx::getGmsfhmMaster, gmsfhm).or().eq(GxtpRygx::getGmsfhmSlave, gmsfhm);
        List<GxtpRygx> gxtpRygxes = list(lambda);
        if (CollectionUtil.isNotEmpty(gxtpRygxes)){
            Set<String> gmsfhms = new HashSet<>();
            for (GxtpRygx gxtpRygx : gxtpRygxes) {
                gmsfhms.add(gxtpRygx.getGmsfhmMaster());
                gmsfhms.add(gxtpRygx.getGmsfhmSlave());
            }
            gmsfhms.remove(gmsfhm);
            return queryChildren(gxtpRygxes, gmsfhms);
        }
        return null;
    }

    /**
     * 查出所有能关联到的人员关系
     * @param gxtpRygxes
     * @param gmsfhms
     * @return
     */
    public List<GxtpRygx> queryChildren(List<GxtpRygx> gxtpRygxes, Set<String> gmsfhms){
        List<String> removeIds = gxtpRygxes.stream().map(GxtpRygx::getId).collect(Collectors.toList());
        LambdaQueryWrapper<GxtpRygx> lambda = new QueryWrapper<GxtpRygx>().lambda();
        lambda.notIn(GxtpRygx::getId, removeIds);
        lambda.and(wrapper -> wrapper.in(GxtpRygx::getGmsfhmMaster, gmsfhms).or().in(GxtpRygx::getGmsfhmSlave, gmsfhms));
        List<GxtpRygx> list = list(lambda);
        if (CollectionUtil.isNotEmpty(list)){
            Set<String> gmsfhmSet = new HashSet<>();
            for (GxtpRygx gxtpRygx : list) {
                gmsfhmSet.add(gxtpRygx.getGmsfhmMaster());
                gmsfhmSet.add(gxtpRygx.getGmsfhmSlave());
            }
            gmsfhmSet.removeAll(gmsfhms);
            gxtpRygxes.addAll(list);
            if (gmsfhmSet.size() > 0){
                queryChildren(gxtpRygxes, gmsfhmSet);
            }
        }
        return gxtpRygxes;
    }
}
